#include <bits/stdc++.h>
using namespace std;
int cnt1_01(int a){
    int ans=0;
    while(a){
        ans++;
        a&=a-1;
    }
    return ans;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int tc;
    scanf("%d",&tc);
    while(tc--){
        int n,m,l,v3;
        scanf("%d%d%d%d",&n,&m,&l,&v3);
        vector<pair<pair<int,int>,int> >cars;
        for(int i=0;i<n;i++){
            int d,v,a;
            scanf("%d%d%d",&d,&v,&a);
            cars.push_back(make_pair(make_pair(d,v),a));
        }
        vector<int>pos3;
        for(int i=0;i<m;i++){
            int nw_pos;
            cin>>nw_pos;
            pos3.push_back(nw_pos);
        }
        vector<int>is_cs(n);
        for(int i=0;i<n;i++){
            int d=cars[i].first.first,v=cars[i].first.second,a=cars[i].second;
            if(a==0){
                if(pos3[m-1]>=d and v>v3)is_cs[i]=1;
            }else if(a<0){
                if(v<=v3)continue;
                int dis1=(v3*v3-v*v)/(2*a)+d;
                vector<int>::iterator it=lower_bound(pos3.begin(),pos3.end(),d);
                if(it!=pos3.end())if((*it)<=dis1)is_cs[i]=1;
            }else{
                if(v>v3){
                    if(pos3[m-1]>=d)is_cs[i]=1;
                }else{
                    int dis1=(v3*v3-v*v)/(2*a)+d+1;
                    if(pos3[m-1]>=dis1)is_cs[i]=1;
                }
            }
        }
        //for(int i=0;i<n;i++)cout<<is_cs[i]<<' ';
        //cout<<endl;
        int sm=0;
        for(int i=0;i<n;i++)sm+=is_cs[i];
        printf("%d ",sm);
        vector<pair<int,int> >segs;
        for(int i=0;i<n;i++)if(is_cs[i]){
            int d=cars[i].first.first,v=cars[i].first.second,a=cars[i].second;
            if(a==0){
                vector<int>::iterator it=lower_bound(pos3.begin(),pos3.end(),d);
                segs.push_back(make_pair(it-pos3.begin(),m-1));
            }else if(a<0){
                int dis1=(v3*v3-v*v)/(2*a)+d;
                vector<int>::iterator it=lower_bound(pos3.begin(),pos3.end(),d);
                vector<int>::iterator it1=lower_bound(pos3.begin(),pos3.end(),dis1);
                segs.push_back(make_pair(it-pos3.begin(),it1-pos3.begin()-1));
            }else{
                if(v>v3){
                    vector<int>::iterator it=lower_bound(pos3.begin(),pos3.end(),d);
                    segs.push_back(make_pair(it-pos3.begin(),m-1));
                }else{
                    int dis1=(v3*v3-v*v)/(2*a)+d+1;
                    vector<int>::iterator it=lower_bound(pos3.begin(),pos3.end(),dis1);
                    segs.push_back(make_pair(it-pos3.begin(),m-1));
                }
            }
        }
        sort(segs.begin(),segs.end(),[&](pair<int,int>a,pair<int,int>b){
            if(a.second!=b.second)return a.second<b.second;
            else return a.first<b.first;
        });
        if(m<=20){
            int ans=m;
            for(int st=0;st<(1<<m);st++){
                int nw_cnt=cnt1_01(st);
                if(nw_cnt>=ans)continue;
                vector<int>st1(m);
                for(int j=0;j<m;j++)st1[j]=((st>>j)&1);
                bool all_ok=1;
                for(pair<int,int>j:segs){
                    bool ok=0;
                    for(int k=j.first;k<=j.second;k++)if(st1[k]){
                        ok=1;
                        break;
                    }
                    if(!ok){
                        all_ok=0;
                        break;
                    }
                }
                if(all_ok)ans=nw_cnt;
            }
            cout<<m-ans<<endl;
            continue;
        }
        sm=0;int lst=-1;
        for(auto i:segs){
            if(i.first>lst){
                lst=i.second;
                sm++;
            }
        }
        printf("%d\n",m-sm);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}